package cmd

import (
	"fmt"
	"gitee.com/hexug/vblog/tree/master/api/cmd/initial"
	"gitee.com/hexug/vblog/tree/master/api/cmd/start"
	"gitee.com/hexug/vblog/tree/master/api/version"
	"github.com/spf13/cobra"
)

var (
	showVersion bool
	rootCmd     = &cobra.Command{
		/*
			Use是单行用法消息。
			建议的语法如下：
			[]标识可选参数。不包含在括号中的参数是必需的。
			...表示可以为上一个参数指定多个值。
			\表示互斥信息。可以使用分隔符左侧的参数或分隔符右侧的参数。不能在一次使用命令时同时使用两个参数。
			{}在需要其中一个参数时分隔一组互斥参数。如果参数为可选，它们用括号（[]）括起来。
			示例：add [-F file | -D dir]... [-f format] file
		*/
		Use: "vblog-api",
		// short是“help”输出中显示的简短描述。
		Short: "vblog的后端服务",
		// Long是“help＜this command＞”输出中显示的长消息。
		Long: "一个前后端分离的vblog demo",
		//Example是如何使用该命令的示例。
		Example: "vblog-api  -v",

		//设置命令的版本，如果不设置这个参数，可以自行设置一个参数version
		//Version: "1.0.1",

		//用来校验参数，参数只允许切片中的值
		//ValidArgs: []string{"a", "b"},

		/*
			ValidArgsFunction是一个可选函数，它为shell完成提供有效的非标志参数。
			它是使用ValidArgs的动态版本。
			命令只能使用ValidArgs和ValidArgsFunction中的一个。
		*/
		//ValidArgsFunction: func(cmd *cobra.Command, args []string, toComplete string) ([]string, cobra.ShellCompDirective) {
		//
		//},

		//Deprecated定义了此命令是否已弃用，并且在使用时应打印此字符串。
		//Deprecated: "将在下个版本废弃",

		/*
			//钩子函数
			// PersistentPeRun：此命令的子级将继承并执行。
			PersistentPreRun func(cmd *Command, args []string)
			// PreRun: 此命令的子级将不会继承。
			PreRun func(cmd *Command, args []string)
			// Run: 通常为实际工作的函数。大多数命令只会实现这一点。
			Run func(cmd *Command, args []string)
			// PostRun: 在“Run”之后运行。
			PostRun func(cmd *Command, args []string)
			// PersistentPostRun: 此命令的子级将在PostRun之后继承并执行。
			PersistentPostRun func(cmd *Command, args []string)
		*/
		Run: func(cmd *cobra.Command, args []string) {
			if showVersion {
				fmt.Println(version.ShortVersion())
				return
			}
			err := cmd.Help()
			cobra.CheckErr(err)
		},
	}
)

func Execute() {
	//cobra.OnInitialize()
	rootCmd.AddCommand(initial.Cmd)
	rootCmd.AddCommand(start.Cmd)
	if err := rootCmd.Execute(); err != nil {
		//fmt.Fprintln(os.Stderr, err)
		//os.Exit(1)
		return
	}
}

func init() {
	rootCmd.Flags().BoolVarP(&showVersion, "version", "v", false, "版本")
}
